﻿#ifndef GRPC_INTERFACE_H
#define GRPC_INTERFACE_H

#include <QObject>
#include <QThread>
#include <QString>
#include <memory>
#include <queue>
#include <grpcpp/grpcpp.h>
#include "proto/plugin_service.grpc.pb.h"
#include "proto/plugin_common.pb.h"

using namespace plugin_service;
using namespace plugin_common;

class GrpcInterface : public QObject
{
    Q_OBJECT
public:
    explicit GrpcInterface(QObject *parent = nullptr);
    ~GrpcInterface() override;

    // 连接 & 同步 RPC 调用
    void connectToServer(const std::string &serverAddr);
    void sendSyncRequest(const CommonRequest &req);

    // 流式 RPC API
    void startStream();
    void stopStream();
    void shutdown(); // 与 stopStream 等价

    void sendStreamMessage(const CommonRequest &req);

signals:
    void streamConnected();             // 流连接成功
    void streamMessage(const QByteArray &data);  // 收到流消息
    void streamError(const QString &err);        // 发生错误
    void streamClosed();               // 流关闭

private:
    // 此槽用于在 Qt 线程内安全地发射信号
    Q_INVOKABLE void emitStreamMessage(const QByteArray &data);

    // 内部辅助方法
    void cqThreadMain();               // CompletionQueue 事件线程主循环
    void handleRpcEvent(void* tag_ptr, bool ok); // 处理 gRPC 异步事件
    void tryWriteNext_locked();        // 已加锁的写队列处理函数
    void tryWriteNext();               // 对外包装，加锁后调用 locked 版本

    // 一个 RPC 流调用的状态对象
    struct StreamCall {
        // gRPC 回调事件标识
        enum class Tag : std::uintptr_t {
            START = 1,
            READ = 2,
            WRITE = 3,
            WRITES_DONE = 4,
            FINISH = 5
        };

        grpc::ClientContext context;
        std::unique_ptr<grpc::ClientAsyncReaderWriter<CommonRequest, CommonResponse>> stream;
        CommonResponse response;
        grpc::Status status;

        bool write_done = false;       // 是否已发送 WritesDone
    };

    std::unique_ptr<PluginService::Stub> m_stub;
    std::unique_ptr<StreamCall> m_call;

    // CompletionQueue 及其工作线程
    std::unique_ptr<grpc::CompletionQueue> m_cq;
    std::thread m_cqThread;
    std::atomic<bool> m_shutdown{false};

    // 写队列相关（线程安全）
    std::mutex m_writeMutex;
    std::deque<CommonRequest> m_writeQueue;
    bool m_writeInProgress{false};

    // 是否已连接标识
    std::atomic<bool> m_connected{false};
};
#endif // GRPC_INTERFACE_H
